/*!
 * \file WtHftStraDemo.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader HFT高频策略示例头文件
 * 
 * \details 该文件定义了WtHftStraDemo类，实现HFT高频策略示例，展示：
 *          
 *          高频交易核心特性：
 *          - 毫秒级Tick数据响应
 *          - 实时订单状态管理
 *          - 精确的持仓控制
 *          - 低延迟的交易执行
 *          - 多线程并发处理
 *          
 *          策略功能模块：
 *          - 市场数据处理：实时Tick和K线数据分析
 *          - 订单管理系统：下单、撤单、订单状态跟踪
 *          - 持仓管理：多空持仓分离管理
 *          - 风险控制：交易频率控制、资金管理
 *          - 通道监控：交易通道状态实时监控
 *          
 *          技术架构：
 *          - 无锁数据结构：降低延迟
 *          - 内存池管理：减少内存分配开销
 *          - 异步事件处理：提高并发性能
 *          - 线程安全设计：支持多线程环境
 *          
 *          作为HFT策略开发的参考模板和学习示例
 */

#pragma once
#include <unordered_set>
#include <memory>
#include <thread>
#include <mutex>

#include "../Includes/HftStrategyDefs.h"

/*!
 * \class WtHftStraDemo
 * \brief HFT高频策略示例实现
 * 
 * \details 该类实现了HftStrategy接口，提供完整的高频策略示例框架：
 *          
 *          核心功能：
 *          - 实时数据处理：毫秒级Tick数据分析和K线数据更新
 *          - 智能订单管理：自动下单、撤单、订单状态跟踪
 *          - 精确持仓控制：多空分离、风险敞口管理
 *          - 交易执行优化：最优执行价格和时机选择
 *          - 通道状态监控：连接状态实时监控和故障处理
 *          
 *          策略特性：
 *          - 高频特化：专为毫秒级交易设计
 *          - 低延迟优化：减少不必要的计算和内存分配
 *          - 并发安全：线程安全的数据结构和算法
 *          - 容错设计：网络断线、数据异常等情况处理
 *          
 *          参数配置：
 *          - 交易标的：支持股票和期货
 *          - 交易频率：可配置的交易时间间隔
 *          - 仓位控制：最大持仓和单笔交易量
 *          - 风险参数：止损、止盈等风险控制参数
 * 
 * \note 该类主要用作HFT策略开发的参考模板
 * \warning 高频交易需要特别注意延迟和并发安全
 * \see HftStrategy, IHftStraCtx
 */
class WtHftStraDemo : public HftStrategy
{
public:
	/*!
	 * \brief 构造函数
	 * \param id 策略实例唯一标识符
	 */
	WtHftStraDemo(const char* id);
	
	/*!
	 * \brief 析构函数
	 */
	~WtHftStraDemo();

private:
	/*!
	 * \brief 检查订单状态
	 * 
	 * \details 定期检查未完成订单的状态：
	 *          - 超时订单自动撤销
	 *          - 异常订单状态处理
	 *          - 订单执行情况统计
	 */
	void	check_orders();

public:
	/*!
	 * \brief 获取策略名称
	 * \return 策略名称字符串
	 */
	virtual const char* getName() override;

	/*!
	 * \brief 获取策略工厂名称
	 * \return 工厂名称字符串
	 */
	virtual const char* getFactName() override;

	/*!
	 * \brief 初始化策略参数
	 * \param cfg 配置参数对象
	 * \return 初始化成功返回true，失败返回false
	 * 
	 * \details 从配置文件中读取策略参数：
	 *          - code: 交易标的代码
	 *          - secs: 交易时间窗口（秒）
	 *          - freq: 交易频率限制
	 *          - offset: 价格偏移量
	 *          - unit: 交易单位
	 *          - reserved: 预留资金比例
	 *          - stock: 是否为股票交易模式
	 */
	virtual bool init(WTSVariant* cfg) override;

	/*!
	 * \brief 策略初始化事件
	 * \param ctx 策略上下文
	 * 
	 * \details 策略启动时调用，用于：
	 *          - 订阅市场数据
	 *          - 初始化交易状态
	 *          - 设置定时任务
	 */
	virtual void on_init(IHftStraCtx* ctx) override;

	/*!
	 * \brief Tick数据事件处理
	 * \param ctx 策略上下文
	 * \param code 合约代码
	 * \param newTick 新的Tick数据
	 * 
	 * \details 高频策略的核心逻辑，处理每个Tick：
	 *          - 实时价格分析
	 *          - 交易信号生成
	 *          - 订单执行决策
	 *          - 风险控制检查
	 */
	virtual void on_tick(IHftStraCtx* ctx, const char* code, WTSTickData* newTick) override;

	/*!
	 * \brief K线数据事件处理
	 * \param ctx 策略上下文
	 * \param code 合约代码
	 * \param period K线周期
	 * \param times 时间戳
	 * \param newBar 新的K线数据
	 * 
	 * \details 处理K线更新事件：
	 *          - 技术指标计算
	 *          - 趋势分析
	 *          - 策略参数调整
	 */
	virtual void on_bar(IHftStraCtx* ctx, const char* code, const char* period, uint32_t times, WTSBarStruct* newBar) override;

	/*!
	 * \brief 成交事件处理
	 * \param ctx 策略上下文
	 * \param localid 本地订单ID
	 * \param stdCode 标准合约代码
	 * \param isBuy 是否买入
	 * \param qty 成交数量
	 * \param price 成交价格
	 * \param userTag 用户标签
	 * 
	 * \details 处理订单成交回报：
	 *          - 更新持仓状态
	 *          - 计算盈亏
	 *          - 记录交易日志
	 *          - 触发后续交易逻辑
	 */
	virtual void on_trade(IHftStraCtx* ctx, uint32_t localid, const char* stdCode, bool isBuy, double qty, double price, const char* userTag) override;

	/*!
	 * \brief 持仓变化事件处理
	 * \param ctx 策略上下文
	 * \param stdCode 标准合约代码
	 * \param isLong 是否多头
	 * \param prevol 之前持仓量
	 * \param preavail 之前可用量
	 * \param newvol 新持仓量
	 * \param newavail 新可用量
	 * 
	 * \details 处理持仓变化通知：
	 *          - 更新持仓记录
	 *          - 风险敞口计算
	 *          - 持仓限额检查
	 */
	virtual void on_position(IHftStraCtx* ctx, const char* stdCode, bool isLong, double prevol, double preavail, double newvol, double newavail) override;

	/*!
	 * \brief 订单状态事件处理
	 * \param ctx 策略上下文
	 * \param localid 本地订单ID
	 * \param stdCode 标准合约代码
	 * \param isBuy 是否买入
	 * \param totalQty 总数量
	 * \param leftQty 剩余数量
	 * \param price 订单价格
	 * \param isCanceled 是否已撤销
	 * \param userTag 用户标签
	 * 
	 * \details 处理订单状态变化：
	 *          - 跟踪订单生命周期
	 *          - 处理部分成交
	 *          - 管理撤单逻辑
	 */
	virtual void on_order(IHftStraCtx* ctx, uint32_t localid, const char* stdCode, bool isBuy, double totalQty, double leftQty, double price, bool isCanceled, const char* userTag) override;

	/*!
	 * \brief 交易通道就绪事件
	 * \param ctx 策略上下文
	 * 
	 * \details 处理交易通道连接成功：
	 *          - 重置连接状态标志
	 *          - 恢复交易功能
	 *          - 同步持仓状态
	 */
	virtual void on_channel_ready(IHftStraCtx* ctx) override;

	/*!
	 * \brief 交易通道断开事件
	 * \param ctx 策略上下文
	 * 
	 * \details 处理交易通道连接断开：
	 *          - 设置断线标志
	 *          - 停止新订单提交
	 *          - 记录断线时间
	 */
	virtual void on_channel_lost(IHftStraCtx* ctx) override;

	/*!
	 * \brief 委托确认事件处理
	 * \param localid 本地订单ID
	 * \param bSuccess 是否成功
	 * \param message 错误信息
	 * \param userTag 用户标签
	 * 
	 * \details 处理订单委托确认：
	 *          - 确认订单是否成功提交
	 *          - 处理委托失败情况
	 *          - 记录错误信息
	 */
	virtual void on_entrust(uint32_t localid, bool bSuccess, const char* message, const char* userTag) override;

private:
	WTSTickData*	_last_tick;			/*!< 最后一个Tick数据 */
	IHftStraCtx*	_ctx;				/*!< 策略上下文指针 */
	std::string		_code;				/*!< 交易标的代码 */
	uint32_t		_secs;				/*!< 交易时间窗口（秒） */
	uint32_t		_freq;				/*!< 交易频率限制 */
	int32_t			_offset;			/*!< 价格偏移量 */
	uint32_t		_unit;				/*!< 交易单位 */
	double			_reserved;			/*!< 预留资金比例 */
	bool			_stock;				/*!< 是否为股票交易模式 */

	typedef std::unordered_set<uint32_t> IDSet;	/*!< 订单ID集合类型 */
	IDSet			_orders;			/*!< 活跃订单集合 */
	std::mutex		_mtx_ords;			/*!< 订单集合互斥锁 */

	uint64_t		_last_entry_time;	/*!< 最后进场时间 */

	bool			_channel_ready;		/*!< 交易通道是否就绪 */
	uint32_t		_last_calc_time;	/*!< 最后计算时间 */
	uint32_t		_cancel_cnt;		/*!< 撤单计数器 */
};

